const fs = require('node:fs/promises')

;(async () => {
  try {
    // 打开src.txt文件，以只读模式打开
    const fileReadHandler = await fs.open('src.txt', 'r')
    // 打开dest.txt文件，以写入模式打开
    const fileWriteHandler = await fs.open('dest.txt', 'w')

    // 创建读取流，每次读取64kb的数据
    const streamRead = fileReadHandler.createReadStream({
      highWaterMark: 64 * 1024,
    }) // 64kb
    // 创建写入流
    const streamWrite = fileWriteHandler.createWriteStream()

    let splitted

    console.time('readBig')

    // 监听读取流的数据事件
    streamRead.on('data', (chunk) => {
      // 将读取的数据转换为字符串，并按空格分割
      const numbers = chunk.toString('utf-8').split('  ')

      // 如果第一个数字加1不等于第二个数字
      if (Number(numbers[0]) + 1 !== Number(numbers[1])) {
        // 如果已经分割过，则将第一个数字和分割后的数字拼接
        if (splitted) {
          numbers[0] = splitted.trim() + numbers[0].trim()
        }
      }

      // 如果倒数第二个数字加1不等于最后一个数字
      if (
        Number(numbers[numbers.length - 2]) + 1 !==
        Number(numbers[numbers.length - 1])
      ) {
        // 将最后一个数字保存到分割变量中
        splitted = numbers.pop()
      }

      console.log('-----------------')
      console.log(numbers)

      // console.log(chunk.length) // 65536
      // console.log(chunk)
      // 遍历数字，如果数字是偶数，则写入写入流
      numbers.forEach((n) => {
        if (n % 2 === 0) {
          if (!streamWrite.write(` ${n} `)) {
            // 如果写入流已满，则暂停读取流
            streamRead.pause()
          }
        }
      })
    })

    // 监听写入流的drain事件，当写入流有空闲空间时，恢复读取流
    streamWrite.on('drain', () => {
      streamRead.resume()
    })

    streamRead.on('end', () => {
      console.timeEnd('readBig')
      console.log('DONE!')
    })
  } catch (err) {
    // 捕获错误并打印
    console.log(err)
  }
})()
